<?php
class Order extends ActiveRecord {
	
	protected $tableName = 'order';
	public $pkName = 'ID_order';
	public $essenceNumberOnPage = 1;			// Количество отображаемых заказов на одной странице
	
	protected $arrSettings = array(
			'created_at' => true,  // в БД храним время создания
			'updated_at' => true, 	// в БД храним время редактирования
			'author' => true			// в БД храним автора (ID_user)
	);
	public $validatesLengthOf = array(
			'order_name' => array('minimum' => 1, 'maximum' => 256, 'message' => 'Заголовок заказа слишком короткий'),
			'description' => array('minimum' => 1, 'message' => 'Описание заказа обязательно')
	);
	
	/**
	 * Метод возвращает название города текущего заказа
	 * @return array
	 */
	public function getCity() {
		Service_Debug::setDebug();
		$objDB = Service_Database::instance();
		$stmt = "SELECT `city_url`.`city_name`
		FROM `city_url`
		INNER JOIN  `order` USING(`city`)
		WHERE `order`.`ID_order`='" . $this->id . "'";
		$arrCity = $objDB->selectSimpleField($stmt);
		return $arrCity;
	}
	
	/**
	 * Метод возвращает автора текущей заказа
	 *  @return array
	 */
	public function getAuthor() {
		Service_Debug::setDebug();
		$objDB = Service_Database::instance();
		$stmt = "SELECT `user`.`first_name`,`user`.`last_name`,`order`.`ID_user`
		FROM  `order`
		INNER JOIN  `user` USING(`ID_user`)
		WHERE `order`.`ID_order`='" . $this->id . "'";
		$arrAuthor = $objDB->selectOne($stmt);
		return $arrAuthor;
	}
	
	public function beforeValidation() {
		Service_Debug::setDebug();
		
		// В случае добавления заказа незалогиненным пользователем необходимо зарегистрировать его
		// Добавляем правила заполнения полей для регистрации
		$objSession = User_Session::instance();
		if (!$objSession->isLoggedIn()) {
			$this->validatesLengthOf['first_name'] = array ('minimum' => 2, 'message' => 'Слишком короткое имя');
			$this->validatesLengthOf['last_name'] = array ('minimum' => 2, 'message' => 'Слишком короткая фамилия');
			$this->validatesLengthOf['pass'] = array('minimum' => 6, 'maximum' => 128, 'message' => 'Пароль введен неверно, должен состоять из 6-128 символов', 'on' => 'create');
			$this->validatesFormatOf['e_mail'] =  array('message' => 'Электронная почта заполнена неверно', 'with' => '|^[\.\-_A-Za-z0-9]+?@[\.\-A-Za-z0-9]+?\.[A-Za-z0-9]{2,6}$|','on' => 'create');
			$this->validatesConfirmationOf['pass'] = array('message' => 'Пароль и его подтверждение не совпадают');
			//$this->validatesAcceptanceOf['confirm'] = array('message' => 'Вы должны быть согласны с условиями', 'on' => 'create');
		}
		
		//Удаляем из сохраняемого массива поля с пустыми значениями
		$arrCheck = $this->tableFields;
		foreach ($arrCheck as $key => $value)
			if ($value=='') $arrCheck[$key] = null;
		$this->tableFields = $arrCheck;
	}
	
	
	public function beforeValidationOnCreate () {
		$objSession = User_Session::instance();
		if(!$objSession->isLoggedIn()) {
			if (!isset($this->tableFields['kaptcha']) || empty($this->tableFields['kaptcha']) || ($objSession->__get('keystring')!=$this->tableFields['kaptcha'])) {
				$error = Service_Translate::getText('Неверный код подтверждения');
				Exception_ActiveRecord::addObjectException(get_class($this), 'kaptcha', $error);
			}
		}
	}
	
	public function beforeCreate() {
		Service_Debug::setDebug();
		$objSession = User_Session::instance();
		if (!$objSession->isLoggedIn()) {
			// Получаем массив данных для регистрации пользователя
			$copiedFieldsArray = array ('first_name', 'last_name', 'pass', 'pass_confirmation', 'e_mail', 'kaptcha');
			foreach ($copiedFieldsArray as $copiedField) {
				// Получаем массив данных для регистрации пользователя, удаляя их при этом из набора данных заказа
				$userArray[$copiedField] = $this->tableFields[$copiedField];
				unset($this->tableFields[$copiedField]);
			}
			$userArray['user_type'] = 'customer';
			$objUser = new User_User($userArray);
			$objUser->save();
			$objAuth = new User_Auth();
			$objAuth->signInSuccess($objUser->id);
		}
		if (isset($this->tableFields['kaptcha'])) unset($this->tableFields['kaptcha']);
	}
	
	// Функция отмечает непрочитанные отклики по заказу , как просмотренные и уменьшает счётчик заказчика по ноывм откликам
	public function makeRead($notReadResponses) {
		Service_Debug::setDebug();
		$objDB = Service_Database::instance();
		// Отмечаем все отклики по текущему заказу как прочитанные
		$stmt = "UPDATE `order_response` SET `is_read` = 1 WHERE `order_response`.`ID_order`='" . $this->id . "'";
		$objDB->query($stmt);
		// Уменьшаем счётчик непрочитанных откликов на величину равную количеству непрочитанных откликов текущего заказа
		User_User::changeNumber('-','orderEvents', $this->getField('ID_user'),$notReadResponses);
	}
	
	/**
	* Функция проверяет может ли текущий пользователь откликнуться на заказ, если пользователь уже оставлял отклик - вернёт 
	* массив данных об этом отклике, иначе если пользователь может оставить отклик - вернёт true ,
	* иначе - false(просмотр "заказчиком" или незарегистрированным пользователем )
	*/
	public function canResponse() {
		Service_Debug::setDebug();
		$objDB = Service_Database::instance();
		$objUser = User_User::getUser();
		$stmt = "SELECT `order_response`.`ID_order_response`,`order_response`.`ID_user`,`order_response`.`text`,`order_response`.`created_at`,`user`.`first_name`,`user`.`last_name` FROM `order_response` LEFT JOIN `user` USING(`ID_user`) WHERE `order_response`.`ID_order`='" . $this->id . "' AND  `order_response`.`ID_user`='" . $objUser->id ."'";
		// Если текущий пользователь мастер и он не ещё не откликался на этот заказ
		$responseArray = $objDB->select($stmt);
		if($objUser->getField('user_type') == 'master'){
			if(!$responseArray) return true;
			else return $responseArray;
		}
		else return false;
	}
}
?>